package net.wzw.config;

import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.*;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.schema.ScalarType;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;
import java.util.List;

/**
 * @className: SwaggerConfig
 * @author: wzw
 * @date: 2024-08-13 13:12
 * @Version: 1.0
 * @description: Swagger 配置类
 */
@Component
@Data
@EnableOpenApi
@EnableWebMvc
public class SwaggerConfig {

    /**
     * 初始化用户微服务 UserApiDoc 信息
     * @return
     */
    @Bean
    public Docket UserApiDoc() {
        return new Docket(DocumentationType.OAS_30)
                .groupName("用户微服务接口文档")
                .pathMapping("/")
                .enable(true) // 是否开启 swagger，false 为关闭，线上可以直接关闭
                .apiInfo(apiInfo()) // 配置 api 文档信息
                .select() // 选择哪些接口作为 swagger 的 doc 发布
                .apis(RequestHandlerSelectors.basePackage("net.wzw"))
                .paths(PathSelectors.ant("/api/**")) // 正则匹配请求路径，并分配至当前组
                .build()
                .globalRequestParameters(globalRequestParameters()) // 新版 swagger 3.0 配置
                .globalResponses(HttpMethod.GET, globalResponses())
                .globalResponses(HttpMethod.POST, globalResponses());

    }

    /**
     * 初始化后台 AdminApiDoc 信息
     * @return
     */
    @Bean
    public Docket AdminApiDoc() {
        return new Docket(DocumentationType.OAS_30)
                .groupName("后台接口文档")
                .pathMapping("/")
                .enable(true) // 是否开启 swagger，false 为关闭，线上可以直接关闭
                .apiInfo(apiInfo()) // 配置 api 文档信息
                .select() // 选择哪些接口作为 swagger 的 doc 发布
                .apis(RequestHandlerSelectors.basePackage("net.wzw"))
                .paths(PathSelectors.ant("/admin/**")) // 正则匹配请求路径，并分配至当前组
                .build();
    }

    /**
     * 初始化 API 文档基础信息
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("华仔电商实战项目")
                .description("微服务接口文档")
                .contact(new Contact("华仔知识星球-wzw", "https://wx.zsxq.com/dweb2/index/group/51122554151214", "1030181803@qq.com"))
                .version("V1.0")
                .build();
    }

    /**
     * 生成全局请求头参数
     * @return
     */
    private List<RequestParameter> globalRequestParameters() {
        List<RequestParameter> parameterList = new ArrayList<>();
        // 如需更多 直接复制修改即可
        parameterList.add(new RequestParameterBuilder()
                .name("token")
                .description("登录令牌信息")
                .in(ParameterType.HEADER)
                .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
                .required(false)
                .build());
        return parameterList;
    }

    private List<Response> globalResponses() {
        List<Response> respList = new ArrayList<>();
        respList.add(new ResponseBuilder().code("4xx").description("请求错误，请认真检查").build());
        return respList;
    }

}